/*
 * Copyright (c) zhg2yqq.com Corp.
 * All Rights Reserved.
 */
package com.zhg2yqq.wheels.mvc.protection;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;

/**
 * @author zhg2yqq, 2023年3月22日
 * @version zhg2yqq v1.0
 */
@Target(METHOD)
@Retention(RUNTIME)
@Documented
@Inherited
@Repeatable(PreventResubmit.PreventResubmits.class)
public @interface PreventResubmit {
    /**
     * 用于区分重复的标识前缀，为空时默认方法名全路径
     */
    @AliasFor("value")
    String[] name() default {};

    /**
     * 用于区分重复的标识前缀，为空时默认方法名全路径
     */
    @AliasFor("name")
    String[] value() default {};

    /**
     * 有效期，单位秒，默认2秒
     * 默认当重复判定时效内再次触发，将依次2，2，2，8，8，32，180，600，600...重新计时判定重复
     */
    int[] ttl() default {2, 2, 2, 8, 8, 32, 180, 600};

    /**
     * 验证方式，默认基于IP
     */
    PreventResubmitType type() default PreventResubmitType.IP;

    /**
     * 验证方式为token时，请求中token的参数名，默认nonce
     */
    String argName() default "nonce";

    /**
     * 重复提交时提示消息
     */
    String message() default "";

    enum PreventResubmitType {
        /**
         * 基于token参数方式验证重复提交
         */
        TOKEN,
        /**
         * 基于IP方式防止频繁提交
         */
        IP;
    }

    @Retention(RUNTIME)
    @Target(METHOD)
    @Documented
    @Inherited
    @interface PreventResubmits {
        PreventResubmit[] value();
    }
}
